package com.zhaofan.other;
//给你两个二进制字符串，返回它们的和（用二进制表示）。
//
// 输入为 非空 字符串且只包含数字 1 和 0。
//
//
//
// 示例 1:
//
// 输入: a = "11", b = "1"
//输出: "100"
//
// 示例 2:
//
// 输入: a = "1010", b = "1011"
//输出: "10101"
//
//
//
// 提示：
//
//
// 每个字符串仅由字符 '0' 或 '1' 组成。
// 1 <= a.length, b.length <= 10^4
// 字符串如果不是 "0" ，就都不含前导零。
//
// Related Topics 位运算 数学 字符串 模拟 👍 834 👎 0


import org.junit.Test;

public class No67 {

    @Test
    public void test(){
        String a="1010";
        String b="1011";
        System.out.println(addBinary1(a,b));
    }

    public String addBinary(String a, String b) {
        StringBuilder sb = new StringBuilder();
        int len=Math.max(a.length(),b.length()),carry=0;
        for (int i = 0; i < len; i++) {
            carry+=i<a.length()?a.charAt(a.length()-1-i)-'0':0;//这里-'0'相当于-48
            carry+=i<b.length()?b.charAt(b.length()-1-i)-'0':0;
            sb.append((char)(carry%2+'0'));
            carry/=2;
        }
        if(carry==1) sb.append(1);
        return sb.reverse().toString();

    }

    //2进制方式操作
    public String addBinary1(String a, String b) {
        StringBuilder sb = new StringBuilder();
        int len=Math.max(a.length(),b.length());
        char ac,bc,carry = '0';
        for (int i = 0; i < len; i++) {
            ac=i<a.length()?a.charAt(a.length()-1-i):'0';//这里-'0'相当于-48
            bc=i<b.length()?b.charAt(b.length()-1-i):'0';
            sb.append((char)(ac^bc^carry));
            carry= (char) ((ac|bc)&carry);
        }
        if(carry=='1') sb.append('1');
        return sb.reverse().toString();

    }

    @Test
    public void test1(){
        System.out.println((char)('1'^'1'<<1));
    }

}
